package com.teradata.singleton.lazy;

/**
 * 懒汉式单例
 * 特点：外部类被调度时，内部类才会被加载
 *  内部类一定要在方法调用前初始化
 *  巧妙地避免了线程安全问题
 * 这种模式兼顾了饿汉式的内存浪费，也兼顾了synchronized的性能问题
 * 完美的屏蔽了这两个缺点
 * 史上最牛逼的单例模式的实现方式
 */
public class LazybonesFastloadSingleton {
    public static boolean initialized = false;
    //默认使用LazybonesFastloadSingleton的时候，会先初始化内部类
    //如果没使用的话，内部类是不加载的

    private LazybonesFastloadSingleton(){
        synchronized (LazybonesFastloadSingleton.class){
            if (initialized == false){
                initialized = !initialized;
            } else {
                throw new RuntimeException("单例已被侵犯");
            }
        }
    }

    /**
     * 每一个关键字都不是多余的
     * static 是为了使单例的空间共享
     * final 为保证这个方法不会被重写、重载
     * @return
     */
    public static final LazybonesFastloadSingleton getInstance() {
        // 在返回结果以前，一定会先加载内部类
        return LazyHolder.LAZY;
    }

    /**
     * 默认不加载，只有在getInstance方法被调用时，才加载
     */
    private static class LazyHolder{
        public static final LazybonesFastloadSingleton LAZY = new LazybonesFastloadSingleton();
    }

}
